/**
 * 表单验证工具类
 * 提供统一的验证函数和错误处理
 */

export interface ValidationResult {
  isValid: boolean
  message: string
}

/**
 * 手机号验证
 * @param phone 手机号
 * @returns 验证结果
 */
export const validatePhone = (phone: string): ValidationResult => {
  if (!phone) {
    return { isValid: false, message: '请输入手机号' }
  }
  
  if (!/^1[3-9]\d{9}$/.test(phone)) {
    return { isValid: false, message: '请输入正确的手机号格式' }
  }
  
  return { isValid: true, message: '' }
}

/**
 * 邮箱验证
 * @param email 邮箱地址
 * @returns 验证结果
 */
export const validateEmail = (email: string): ValidationResult => {
  if (!email) {
    return { isValid: false, message: '请输入邮箱地址' }
  }
  
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
    return { isValid: false, message: '请输入正确的邮箱格式' }
  }
  
  return { isValid: true, message: '' }
}

/**
 * 身份证号验证
 * @param idCard 身份证号
 * @returns 验证结果
 */
export const validateIdCard = (idCard: string): ValidationResult => {
  if (!idCard) {
    return { isValid: false, message: '请输入身份证号码' }
  }
  
  if (!/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(idCard)) {
    return { isValid: false, message: '请输入正确的身份证号码格式' }
  }
  
  return { isValid: true, message: '' }
}

/**
 * 固定电话验证
 * @param tel 固定电话
 * @returns 验证结果
 */
export const validateTel = (tel: string): ValidationResult => {
  if (!tel) {
    return { isValid: true, message: '' } // 固定电话通常是选填的
  }
  
  if (!/^0\d{2,3}-?\d{7,8}$/.test(tel)) {
    return { isValid: false, message: '请输入正确的固定电话格式，如：010-12345678' }
  }
  
  return { isValid: true, message: '' }
}

/**
 * 姓名验证
 * @param name 姓名
 * @returns 验证结果
 */
export const validateName = (name: string): ValidationResult => {
  if (!name) {
    return { isValid: false, message: '请输入姓名' }
  }
  
  if (name.length < 2 || name.length > 20) {
    return { isValid: false, message: '姓名长度应在2-20个字符之间' }
  }
  
  if (!/^[\u4e00-\u9fa5a-zA-Z\s]+$/.test(name)) {
    return { isValid: false, message: '姓名只能包含中文、英文和空格' }
  }
  
  return { isValid: true, message: '' }
}

/**
 * 身高验证
 * @param height 身高（cm）
 * @returns 验证结果
 */
export const validateHeight = (height: string): ValidationResult => {
  if (!height) {
    return { isValid: false, message: '请输入身高' }
  }
  
  const heightNum = parseFloat(height)
  if (isNaN(heightNum) || heightNum < 50 || heightNum > 250) {
    return { isValid: false, message: '身高应在50-250cm之间' }
  }
  
  return { isValid: true, message: '' }
}

/**
 * 体重验证
 * @param weight 体重（kg）
 * @returns 验证结果
 */
export const validateWeight = (weight: string): ValidationResult => {
  if (!weight) {
    return { isValid: false, message: '请输入体重' }
  }
  
  const weightNum = parseFloat(weight)
  if (isNaN(weightNum) || weightNum < 10 || weightNum > 300) {
    return { isValid: false, message: '体重应在10-300kg之间' }
  }
  
  return { isValid: true, message: '' }
}

/**
 * 地址验证
 * @param address 地址
 * @returns 验证结果
 */
export const validateAddress = (address: string): ValidationResult => {
  if (!address) {
    return { isValid: false, message: '请输入地址' }
  }
  
  if (address.length < 5 || address.length > 200) {
    return { isValid: false, message: '地址长度应在5-200个字符之间' }
  }
  
  return { isValid: true, message: '' }
}

/**
 * 必填字段验证
 * @param value 字段值
 * @param fieldName 字段名称
 * @returns 验证结果
 */
export const validateRequired = (value: string, fieldName: string): ValidationResult => {
  if (!value || value.trim() === '') {
    return { isValid: false, message: `请输入${fieldName}` }
  }
  
  return { isValid: true, message: '' }
}

/**
 * 数字输入格式化（只保留数字）
 * @param value 输入值
 * @returns 格式化后的值
 */
export const formatNumericInput = (value: string): string => {
  return value.replace(/\D/g, '')
}

/**
 * 身份证号输入格式化（只保留数字和X）
 * @param value 输入值
 * @returns 格式化后的值
 */
export const formatIdCardInput = (value: string): string => {
  return value.replace(/[^\dXx]/g, '').toUpperCase()
}

/**
 * 固定电话输入格式化（只保留数字和连字符）
 * @param value 输入值
 * @returns 格式化后的值
 */
export const formatTelInput = (value: string): string => {
  return value.replace(/[^\d-]/g, '')
}

/**
 * 邮箱输入格式化（转换为小写）
 * @param value 输入值
 * @returns 格式化后的值
 */
export const formatEmailInput = (value: string): string => {
  return value.toLowerCase()
}

/**
 * 小数输入格式化（只保留数字和小数点）
 * @param value 输入值
 * @returns 格式化后的值
 */
export const formatDecimalInput = (value: string): string => {
  return value.replace(/[^\d.]/g, '')
}

/**
 * 批量验证表单字段
 * @param fields 字段验证配置
 * @returns 验证结果
 */
export const validateFields = (fields: Array<{
  value: string
  validator: (value: string) => ValidationResult
  fieldName: string
}>): { isValid: boolean; errors: Record<string, string> } => {
  const errors: Record<string, string> = {}
  let isValid = true
  
  fields.forEach(({ value, validator, fieldName }) => {
    const result = validator(value)
    if (!result.isValid) {
      errors[fieldName] = result.message
      isValid = false
    }
  })
  
  return { isValid, errors }
}

/**
 * 表单提交状态管理
 */
export class FormSubmissionManager {
  private isSubmitting = false
  private callbacks: Array<(isSubmitting: boolean) => void> = []
  
  /**
   * 添加状态变化回调
   * @param callback 回调函数
   */
  onStateChange(callback: (isSubmitting: boolean) => void) {
    this.callbacks.push(callback)
  }
  
  /**
   * 开始提交
   */
  startSubmission() {
    this.isSubmitting = true
    this.notifyCallbacks()
  }
  
  /**
   * 结束提交
   */
  endSubmission() {
    this.isSubmitting = false
    this.notifyCallbacks()
  }
  
  /**
   * 获取提交状态
   */
  getSubmissionState() {
    return this.isSubmitting
  }
  
  private notifyCallbacks() {
    this.callbacks.forEach(callback => callback(this.isSubmitting))
  }
}

/**
 * 错误消息显示工具
 */
export class ErrorMessageManager {
  private errors: Record<string, string> = {}
  
  /**
   * 设置错误消息
   * @param field 字段名
   * @param message 错误消息
   */
  setError(field: string, message: string) {
    this.errors[field] = message
  }
  
  /**
   * 清除错误消息
   * @param field 字段名
   */
  clearError(field: string) {
    delete this.errors[field]
  }
  
  /**
   * 清除所有错误消息
   */
  clearAllErrors() {
    this.errors = {}
  }
  
  /**
   * 获取错误消息
   * @param field 字段名
   * @returns 错误消息
   */
  getError(field: string): string {
    return this.errors[field] || ''
  }
  
  /**
   * 检查是否有错误
   * @returns 是否有错误
   */
  hasErrors(): boolean {
    return Object.keys(this.errors).length > 0
  }
  
  /**
   * 获取所有错误
   * @returns 所有错误
   */
  getAllErrors(): Record<string, string> {
    return { ...this.errors }
  }
}